using System;
using System.Collections;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;

namespace kostenbuch
{
    /// <summary>
    /// Interaktionslogik für Tabelle.xaml
    /// </summary>
    public partial class TablePage : Page
    {
        public static ObservableCollection<Eintrag> eintragList = new ObservableCollection<Eintrag>();
        public static String xmlPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\TransactionManager";
        public static String fileName = "Eintraege.xml";
        public TablePage()
        {
            InitializeComponent();

            ShowsNavigationUI = false;
            //Eintraege in der Tabelle anzeigen
            lb_eintrag.ItemsSource = eintragList;
        }
        internal static void save()
        {
            XmlReadWrite.writeXml(xmlPath, fileName, eintragList);
            kostenbuch.Properties.Settings.Default.Save();
        }
        internal static void checkMonthly()
        {
            Eintrag ein;
            int length = eintragList.Count;
            //array zum markieren neuer monatlicher eintraege
            bool[] entries = new bool[length];
            DateTime date = DateTime.Now;
            for (int i = 0; i < length; i++)
            {
                entries[i] = false;
            }

            //monatliche Eintraege finden, die bis "heute" erneut auftreten aber noch nicht vorhanden sind
            for (int i = 0; i < length; i++)
            {
                //monatliche eintraege finden
                //wenn Transaktion monatlich und, tag <= heute und monat oder jahr = heute, oder monat < letzter monat und jahr <= heute, neue eintraege "beantragen"
                if (eintragList[i].getMonatlich()
                    && (    (eintragList[i].getDatum().Day <= DateTime.Now.Day && (eintragList[i].getDatum().Month < DateTime.Now.Month || eintragList[i].getDatum().Year < DateTime.Now.Year))
                         || (eintragList[i].getDatum().Month < (DateTime.Now.Month - 1) && eintragList[i].getDatum().Year <= DateTime.Now.Year)
                       )
                    )
                {
                    entries[i] = true;
                }
                //"antrag" hinzufuegen
                if (entries[i])
                {
                    date = eintragList[i].getDatum();
                    int month = eintragList[i].getDatum().Month;
                    int year = eintragList[i].getDatum().Year;
                    bool now = false;
                    bool add = true;
                    //einfuegen wiederholen fuer noch nicht eingetragene monate
                    do
                    {
                        if (month < 12)
                        {
                            month++;
                            date = new DateTime(year, month, date.Day);
                        }
                        else
                        {
                            month = 1;
                            year++;
                            date = new DateTime(year, month, date.Day);
                        }
                        //Console.WriteLine(date.ToString());
                        ein = new Eintrag(date,
                                            eintragList[i].getTitle(),
                                            eintragList[i].getBetrag(),
                                            eintragList[i].getAusgabe(),
                                            eintragList[i].getKategorie(),
                                            eintragList[i].getMonatlich(),
                                            eintragList[i].getKonto(),
                                            "Automaticher monatlicher Eintrag");

                        //neuen eintrag mit alten Folgeeintraegen vergleichen, um doppelte eintraege zu vermeiden
                        for (int j = i + 1; j < length; j++)
                        {
                            //wenn tag, titel und monat oder jahr gleich sind, "antrag" zurueck stezen (eintrag bereits vorhanden)
                            if (    ein.getDatum().Day == eintragList[j].getDatum().Day
                                 && ein.getDatum().Month == eintragList[j].getDatum().Month
                                 && ein.getDatum().Year == eintragList[j].getDatum().Year
                                 && ein.getTitle().Equals(eintragList[j].getTitle())
                                )
                            {
                                add = false;
                            }
                        }

                        //"Zukunftseintraege" vermeiden und Eintrag hinzufuegen
                        if (date.Day <= DateTime.Now.Day && (ein.getDatum().Month <= DateTime.Now.Month || ein.getDatum().Year <= DateTime.Now.Year) && add)
                            eintragList.Add(ein);

                        //abfrage, ob aktuelles datum erreicht wurde, da die bedingung in der schleife nicht funktioniert...
                        if (year == DateTime.Now.Year && month == DateTime.Now.Month)
                            now = true;
                    } while (!now);
                    MainWindow.unsaved = true;
                }
            }
            eintragList.BubbleSort();
            //neue eintraege speichern, wenn es welche gab
            if (MainWindow.unsaved)
            {
                save();
                MainWindow.unsaved = false;
            }
        }



        //Fenster mit dem Speicherdialog anzeigen
        private void buttonSave_Click(object sender, RoutedEventArgs e)
        {
            save();
            MainWindow.unsaved = false;
        }
        //Fenster zum Hinzufuegen neuer Eintraege anzeigen
        private void click_new_form(object sender, RoutedEventArgs e)
        {
            form formular = new form();
            formular.ShowDialog();
        }
        //Fenster zum Hinzufuegen neuer Kategorien anzeigen
        private void editKategorie_Click(object sender, RoutedEventArgs e)
        {
            KategorieHinzufügen formular = new KategorieHinzufügen();
            formular.ShowDialog();
        }
        //Fenster zum Hinzufuegen neuer Konten anzeigen
        private void editKonto_Click(object sender, RoutedEventArgs e)
        {
            KontoHinzufuegen formular = new KontoHinzufuegen();
            formular.ShowDialog();
        }
        //zur Diagrammansicht wechseln
        private void chartButton_Click(object sender, RoutedEventArgs e)
        {
            NavigationService nav = NavigationService.GetNavigationService(this);
            Uri uri = new Uri("ChartPage.xaml", UriKind.RelativeOrAbsolute);
            nav.Navigate(uri);
        }
        ////Fenster zum Bearbeiten des gewaehlten Eintrags anzeigen
        private void edit_Click(object sender, RoutedEventArgs e)
        {
            int i = lb_eintrag.SelectedIndex;
            if (i > -1)
            {
                form formular = new form(eintragList[i], i);
                formular.ShowDialog();
            }
            else
                MessageBox.Show("Bitte Eintrag auswählen!", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
        }
        //Eintrag in der Collection aktualisieren
        public static void updateEintrag(Eintrag e, int pos)
        {
            eintragList[pos] = e;
        }
        //Gewaehlten Eintrag aus der Collection entfernen
        private void delete_Click(object sender, RoutedEventArgs e)
        {
            int i = lb_eintrag.SelectedIndex;
            if (i > -1)
            {
                var selected = new ArrayList(lb_eintrag.SelectedItems);
                foreach(var item in selected.ToArray())
                    eintragList.RemoveAt(lb_eintrag.Items.IndexOf(item));
            }
            else
                MessageBox.Show("Bitte Eintrag auswählen!", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
            lb_eintrag.SelectedIndex = i;
            MainWindow.unsaved = true;
        }
    }
}
